package com.demo.base.util;

import cn.hutool.core.io.FileTypeUtil;
import com.demo.base.exception.AiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description 音频属性限制
 * @date 2023/3/25 4:10 PM
 */
@Slf4j
public class AudioPropertyLimitUtil {

    /** 支持的音频格式 */
    private static final Set<String> FORMAT_SET = new HashSet<>(Arrays.asList("WAV", "MP3"));

    /**
     * 检测音频合法性，格式、大小
     *
     * @param file
     */
    public static void propertyLimit(MultipartFile file) {

        // 限制文件类型
        limitByFormat(file);
    }

    /**
     * 限制大小
     *
     * @param file
     * @return
     */
    public static Boolean limitBySize(MultipartFile file) {

        // 单位换算为M
        double fileSize = (double) file.getSize() / 1048576;

        if (fileSize >= 20) {
            log.error("音频大小错误，大小为：{}", fileSize);

            throw new AiException("音频文件大小请小于20MB");
        }

        return true;
    }

    /**
     * 通过格式限制音频
     *
     * @param file
     * @return
     */
    public static Boolean limitByFormat(MultipartFile file) {

        try {
            // 获取文件类型，后缀
            String type = FileTypeUtil.getType(file.getInputStream());

            // 获取文件类型
            String contentType = file.getContentType();
            if (StringUtils.isBlank(contentType)) {
                log.error("音频格式获取失败，结果为空");

                throw new AiException("网络错误，请重试");
            }

            // 判断content type是不是audio
            if (!"audio".equals(contentType.substring(0, contentType.indexOf("/")))) {
                log.error("音频格式错误，不是audio");

                throw new AiException("请上传正确的音频文件格式类型");
            }

            if (StringUtils.isBlank(type)) {
                log.error("音频格式获取失败，结果为空");

                throw new AiException("请上传正确的音频文件格式类型");
            }

            if (!FORMAT_SET.contains(type.toUpperCase())) {
                log.error("音频格式错误，音频格式为：{}", type);

                throw new AiException("请上传正确的音频文件格式类型");
            }

        } catch (IOException e) {
            log.error("音频格式获取失败，异常：{}", e.getMessage());

            throw new AiException("网络错误，请重试");
        }

        return true;
    }
}
